	<?php

	require_once ("Money.class.php");
	require_once ("MoneyFactory.class.php");
	require_once ("MoneyExceptions.php");

	class PorteMonnaie {

		private $_otherCurrencies = array();


	 	//calcul de la valeur d'une poche du porte monnaie quand on y ajoute une piece (operation mono devise)
		public static function add($m1,$m2) {
			
			$exc=new IncompatiblesCurrenciesException("incompatible currencies");
			
			if (!$m1->sameCurrency($m2)) {
				throw new IncompatiblesCurrenciesException();
			}
			
			$_factory=MoneyFactory::getDefaultFactory();
			
			return $_factory->createMoney($m1->getValue()+$m2->getValue(),$m1->getCurrency());	
		}

	 	//calcul de la valeur d'une poche du porte monnaie quand on y enlève une piece (operation mono devise)
		public static function suppr($m1,$m2) {
			
			$exc=new IncompatiblesCurrenciesException("incompatible currencies");
			$excMoney=new NotEnoughMoneyException("Not Enough Money");
			
			if (!$m1->sameCurrency($m2)) {
				throw new IncompatiblesCurrenciesException();
			}
			
			if ($m1->getValue()<$m2->getValue()) {
				throw new NotEnoughMoneyException();
			}

			$_factory=MoneyFactory::getDefaultFactory();
			
			return $_factory->createMoney($m1->getValue()-$m2->getValue(),$m1->getCurrency());	
		}

	    //valeur du porte feuille mis à jour quand on y ajoute une piece (multi devise)

		public static function addMulti($money,$wallet) {

			
			$res=$wallet;
			foreach (MoneyFactory::getDefaultFactory()->getCurrencies() as $key => $currenciesPossible) {

				if(strcmp($currenciesPossible,$money->getCurrency())==0){
					$i=0;
					foreach ($wallet as $key => $cur) {
						if(strcmp($cur->getCurrency(),$money->getCurrency())==0){
							$res[$i] = PorteMonnaie::add($cur,$money);
						}
						$i++;
					}
				}
				
			}

			return $res;
		}


	    //valeur du porte feuille mis à jour quand on y enlève une piece (multi devise)


		public static function supprMulti($money,$wallet) {

			$res = $wallet;
			
			foreach (MoneyFactory::getDefaultFactory()->getCurrencies() as $key => $currenciesPossible) {

		  		//on verifie que la monnaie est bien une monnaie connue
				if(strcmp($currenciesPossible,$money->getCurrency())==0){
					$i=0;
	  				//on parcout tout le porte monnaie
					foreach ($wallet as $key => $cur) {

						if(strcmp($cur->getCurrency(),$money->getCurrency())==0){
							try{

							//on essaie d'enlever toute la monnaie demandée à la devise demandée
								$res[$i]=PorteMonnaie::suppr($cur,$money);
							}
							catch (NotEnoughMoneyException $e){
								//Si on a pas assez d'argent on regarde si on a assez de monnaie en utilisant les autres devises
								//cashTotal représente l'argent que l'on a dans la monnaie demandée en convertissant tous les pieces que l'on posséde
								$cashTotal=O;
								//indexCurrency représente l'indice du porte monnaie où la devise est celle demandée 
								$indexCurrency;
								for ($ind=0;$ind<sizeof($wallet);$ind++){
									if(strcmp($wallet[$ind]->getCurrency(),$money->getCurrency())==0){


										$cashTotal=$cashTotal+$wallet[$ind]->getValue();
										$indexCurrency=$ind;
									}
									else {
										$cashTotal=$cashTotal+Money::convertTo($wallet[$ind],$money->getCurrency())->getValue();
									}
								}
								//si on a assez d'argent en convertissant toutes les devises
								if ($cashTotal>$money->getValue()){
									$cashEncoreADonner=$money->getValue();
									//on donne déja la maximun de la devise demandée
									$res[$indexCurrency]= MoneyFactory::getDefaultFactory()->createMoney(0,$money->getCurrency());
									//on calcule ce qu'il nous reste à donner
									$cashEncoreADonner = $cashEncoreADonner-$wallet[$indexCurrency]->getValue();
									//On parcourt le porte feuille et on convertit des pieces d'une autre devise pour finir le paiement
									for ($ind=0; $ind <sizeof($wallet) ; $ind++) { 
										if(!$ind==$indexCurrency){
											//on convertit toutes les pieces d'une poche pour savoir combien on peut donner dans la monnaie voulue
											$cashWalletCell = Money::convertTo($wallet[$ind],$money->getCurrency())->getValue();

											//on a assez d'argent pour finir le paiement
											if($cashWalletCell>$cashEncoreADonner){
												//on met à jour le porte monnaie
												$monnaieAEnlever = Money::convertTo(new Money($cashEncoreADonner,$money->getCurrency()),$wallet[$ind]->getCurrency())->getValue(); 
												$res[$ind]=PorteMonnaie::suppr($wallet[$ind],MoneyFactory::getDefaultFactory()->createMoney($monnaieAEnlever,$wallet[$ind]->getCurrency()));
												$cashEncoreADonner=0;
											}
											//si on a pas assez d'argent on donne le maximun que l'on peut et on va chercher dans les autres devises pour finir le paiement
											else {
												$cashEncoreADonner = $cashEncoreADonner - Money::convertTo($wallet[$ind],$wallet[$ind]->getCurrency())->getValue();
												$res[$ind]= MoneyFactory::getDefaultFactory()->createMoney(0,$wallet[$ind]->getCurrency());

											}

										}
									}

								}
								//même en convertissant toutes les pieces dans la devise voulue on ne peut effectuer le paiement on alerte l'utilisateur que la transaction est impossible
								else {
									echo "<script type=\"text/javascript\">
									alert(\"Vous n\'avez pas assez d\'argent pour effectuer cette opération\");
									</script>";
								}
							}
						}
						$i++;
					}
				}
			}

			return $res;
		}



	}
	?>
